﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;
using System.Data;
using System.Text;

namespace Servico
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public DataTable HelloWorld()
        {
            DataTable tabela = new DataTable("OLA");
            tabela.TableName = "OLA";
            tabela.Columns.Add("Numero", typeof(string));
            tabela.Columns.Add("Primeiro", typeof(string));
            tabela.Columns.Add("Segundo", typeof(string));

            tabela.Rows.Add(1, "hello", "world");
            tabela.Rows.Add(2, "hello", "world");
            return tabela;
        }


        [WebMethod]
        //Para testar a ligacao a bd e inserir um cliente (NAO FAZ PARTE DA MODULACAO)
        public bool registarCliente(string email, string password, string primeiro_nome, string ultimo_nome, string telefone, string endereco, string cidade, string distrito, string cod_postal)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            bool res = false;
            int id_morada;
            Negocio.Cliente cli = new Negocio.Cliente(0, email, password, primeiro_nome, ultimo_nome, telefone, endereco, cidade, distrito, cod_postal);
            
            smi.connect();
            if ((id_morada= smi.registarMoradaCliente(cli)) != -1) res = true;
            smi.disconnect();
            
            if (res)
            {
                smi.connect();
                if (smi.registarCliente(cli, id_morada)) res = true;
                smi.disconnect();
            }

            return res;

        }




        [WebMethod]
        //Para testar AutenticarEmail(NAO FAZ PARTE DA MODULACAO)
        public bool autenticarCliente(String email, String password)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (smi.autenticarCliente(email, password)) res = true;
            else res = false;
            smi.disconnect();
            return res;
        }

        [WebMethod]
        //Para testar AutenticarEmail(NAO FAZ PARTE DA MODULACAO)
        public bool autenticarFuncionario(String email, String password)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (smi.autenticarFuncionario(email, password)) res = true;
            else res = false;
            smi.disconnect();
            return res;
        }

        [WebMethod]
        //Para testar validaClienteEmail(NAO FAZ PARTE DA MODULACAO)
        public bool validarEmailCliente(String email)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (!smi.validarEmailCliente(email.ToUpper())) res = false;
            else res = true;
            smi.disconnect();
            return res;

        }

        [WebMethod]
        public bool validarEmailFuncionario(String email)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (!smi.validarEmailFuncionario(email.ToUpper())) res = false;
            else res = true;
            smi.disconnect();
            return res;
        }

        [WebMethod]
        public int nivelFuncionario(string email)
        {
            int i = 0;
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            i = smi.nivelFuncionario(email);
            smi.disconnect();
            return i;

        }

        [WebMethod]
        public bool beginEscalonamento()
        {
            bool registou;
            //try
            //{
                Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
                smi.connect();
                Escalonador escalonador = new Escalonador();
                String planeamentoXML = escalonador.init();
                registou = smi.registarPlaneamentoGeral(planeamentoXML);
                smi.disconnect();
            //}
            //catch (Exception)
            //{
            //    registou = false;
            //}
            return registou;
        }

        [WebMethod]
        //Para testar procura cliente (NAO FAZ PARTE DA MODULACAO)
        public DataTable procurarCliente(string email)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();

            Negocio.Cliente cli = new Negocio.Cliente();
            cli = smi.procurarCliente(email);
            smi.disconnect();
            //return cli.toString();
            // TODO acabar
            DataTable tabela = new DataTable("Cliente");
            tabela.TableName = "Cliente";
            tabela.Columns.Add("Email", typeof(string));
            tabela.Columns.Add("Primeiro Nome", typeof(string));
            tabela.Columns.Add("Último Nome", typeof(string));
            tabela.Columns.Add("Telefone", typeof(string));
            tabela.Columns.Add("Endereço", typeof(string));
            tabela.Columns.Add("Cidade", typeof(string));
            tabela.Columns.Add("Distrito", typeof(string));
            tabela.Columns.Add("Código Postal", typeof(string));

            tabela.Rows.Add(cli.getEmail(), cli.getPrimeiro_nome(), cli.getUltimo_nome(), cli.getTelefone(), cli.getEndereco(), cli.getCidade(), cli.getDistrito(), cli.getCod_postal());
            return tabela;

        }

        [WebMethod]
        public DataTable informacaoInstalacoes(string email)
        {
            DataTable data;
            try
            {
                Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
                smi.connect();
                data = smi.informacaoInstalacoes(email);
                smi.disconnect();
                return data;
            }
            catch (Exception e) { return null; }
        }
        [WebMethod]
        public bool submeterPedido(string email,int id_pedido_recebidos)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (smi.submeterPedido(email,id_pedido_recebidos)) res = true;
                else res = false;
            smi.disconnect();
            return res;
        }
        [WebMethod]
        public bool registarPlaneamentoGeral(string planeamento)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res;
            if (smi.registarPlaneamentoGeral(planeamento)) res = true;
            else res = false;
            smi.disconnect();
            return res;
       }

        //Mudei isto de String para DateTime
        [WebMethod]
        public string consultarPlaneamentoGeral(DateTime data) {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            string res="";
            data = data.Date.AddDays(-1);
            res = smi.consultarPlaneamentoGeral(data);
            smi.disconnect();
            return res;
        }
        //TODO IMPORTANTÍSSIMO: VER ISTO DAS DATAS! SE JÁ VIER POR REFERENCIA A DATA DE ONTEM, JA NAO É PRECISO FAZER ADDDAYS(-1)!!!
        [WebMethod]
        public string consultarPlaneamentoPessoal(String email, DateTime d)
        {
            d = d.Date.AddDays(-1);
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            string res = "";
            //string email = "ze@socrates.com";
            //DateTime d = DateTime.Now.AddDays(-1);
            res = smi.consultarPlaneamentoPessoal(email, d);
            smi.disconnect();
            return res;
        }

        [WebMethod]
        public bool verificaValidadePedido(string email, int id_pedido)
        {
            bool res;
            //try
            //{
                Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
                smi.connect();

                DataTable dt = smi.tarefasPendentes();
                DataRow[] dr = dt.Select("id_cliente=" + smi.procurarCliente(email).getId() + " AND id_pedido="+id_pedido);
                // se nao existir registos entao o pedido é válido e pode ser acrescentado à base de dados
                if (dr.Length == 0) res = true;
                else res = false;

                smi.disconnect();
                return res;
            //}
            //catch (Exception e) { return false; }
        }


        [WebMethod]
        public DataTable tarefasPendentesTecnico(string email, DateTime data)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            DataTable dt = new DataTable(), dt2 = new DataTable(), res = new DataTable();
            res.TableName = "TarefasPendentesTecnico";
            dt.TableName = "TarefasPendentesTecnico1";
            dt2.TableName = "TarefasPendentesTecnico2";
            dt = smi.planeamentoToDataTable(email, data);
            dt2 = smi.tarefasPendentes();
            res = filtraTarefasPendentes(dt, dt2, email, smi);
            
            
            smi.disconnect();
            return res;
        }

        protected DataTable criaTabela()
        {
            DataTable myDataTable = new DataTable();
            myDataTable.TableName = "TarefasPendentesTecnico";
            System.Data.DataColumn myDataColumn = new System.Data.DataColumn();



            myDataColumn = new DataColumn();
            myDataColumn.ColumnName = "id_pedidos_recebidos";
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.ColumnName = "id_tarefa";
            myDataColumn.DataType = System.Type.GetType("System.Int32");
            myDataTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.ColumnName = "designacao_tarefa";
            myDataColumn.DataType = System.Type.GetType("System.String");
            myDataTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.ColumnName = "hora_inicio";
            myDataColumn.DataType = System.Type.GetType("System.DateTime");
            myDataTable.Columns.Add(myDataColumn);

            myDataColumn = new DataColumn();
            myDataColumn.ColumnName = "hora_fim";
            myDataColumn.DataType = System.Type.GetType("System.DateTime");
            myDataTable.Columns.Add(myDataColumn);

            return myDataTable;
        }

        protected void insereNaDataTable(DataTable myDataTable, DataRow row)
        {
            DataRow dataRow = myDataTable.NewRow();
            dataRow[0] = row[0];
            dataRow[1] = row[1];
            dataRow[2] = row[2];
            dataRow[3] = row[3];
            dataRow[4] = row[4];
            myDataTable.Rows.Add(dataRow);
        }

        private DataTable filtraTarefasPendentes(DataTable dt1, DataTable dt2, string email, Dados.SMI smi)

        {

            DataTable res = criaTabela();

            DataRow[] dr = dt1.Select(), dr2 = dt2.Select();

            bool found = false;

            StringBuilder teste = new StringBuilder();

            for (int i = 0; i < dr.Length; i++)
            {
                found = false;
                
                for (int j = 0; j < dr2.Length && !found; j++)
                {
                    //teste.Append("id_pedidos_recebidos:\ndr1: " + dr[i]["id_pedidos_recebidos"] + "; dr2: " + dr2[j]["id_pedidos_recebidos"]);
                    //teste.Append("id_tarefa:\ndr1: " + dr[i]["id_tarefa"] + "; dr2: " + dr2[j]["id_tarefa"]);
                    if ((int)dr[i]["id_pedidos_recebidos"] == (int)dr2[j]["id_pedidos_recebidos"] && (int)dr[i]["id_tarefa"] == (int)dr2[j]["id_tarefa"])
                    {
                        found = true;
                        insereNaDataTable(res, dr[i]);
                    }
                }
            }
            return res; //teste.ToString()
        }

        [WebMethod]
        public bool registarTarefasRealizadasTecnico(string email, int id_pedidos_recebidos, int id_tarefa, string accao, DateTime hora_fim)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res = smi.registarTarefasRealizadasTecnico(email, id_pedidos_recebidos, id_tarefa, accao, hora_fim);
            smi.disconnect();

            return res;
        }

        [WebMethod]
        public bool verificaExistenciaPlaneamento(DateTime date)
        {
            Dados.SMI smi = new Dados.SMI("192.168.2.79\\SQLEXPRESS", "STAFFSCHED", "LI4", "obelo");
            smi.connect();
            bool res = smi.verificaExistenciaPlaneamento(date);
            smi.disconnect();

            return res;
        }

    }
}